package com.njxxted.activiti.common.listener.process;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.njxxted.activiti.common.constant.Constant;
import com.njxxted.activiti.common.util.*;
import com.njxxted.activiti.modules.api.PushApi;
import com.njxxted.activiti.modules.api.entity.PushVo;
import com.njxxted.activiti.modules.process.defintion.dao.ActDefinitionDao;
import com.njxxted.activiti.modules.process.defintion.dao.ActRunDefinitionDao;
import com.njxxted.activiti.modules.process.defintion.entity.ActNodeConfigEntity;
import com.njxxted.activiti.modules.process.extend.entity.ExtendActInstanceEntity;
import com.njxxted.activiti.modules.process.extend.service.ExtendActInstanceService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.identity.User;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 描述：一般任务完成事件监听器。 <pre>
 *     1.携带上一任务的分发令牌。
 *     2.记录新产生的任务，为后续的回退作准备。
 *     3.添加流程意见。
 *     4.启动流程时添加或保存状态数据。
 *     5.如果当前节点是分发节点则进行任务分发，并直接返回，否则往下执行。
 *     6.从上下文中获取分配人员的数据，进行分配，如果有人员则进行分配，如果没有则往下执行。
 *     7.从数据库中加载人员进行人员分配。
 * <p>
 * 作者：Ostrich Hu
 * 时间：2019/8/9 10:10 星期五
 */
public class TaskFinishListener extends BaseTemplateTaskListener {

    private static final long serialVersionUID = 7431672174950507061L;

    @Override
    protected void execute(DelegateTask delegateTask, String processDefId, String activityId) {
        logger.debug("触发任务完成监听器：\n任务节点id：{}\n流程定义id：{}\n委托任务：{}", activityId, processDefId, delegateTask);
        String processKey = processDefId.split("[:]")[0];
        ActNodeConfigEntity nodeConfigEntity = new ActNodeConfigEntity();
        nodeConfigEntity.setKey(processKey);
        nodeConfigEntity.setNodeId(activityId);
        IdentityService identityService = (IdentityService) ContextFactoryUtil.getBean("identityService");
        ExtendActInstanceService extActPInstanceService = (ExtendActInstanceService) ContextFactoryUtil.getBean("extActPInstanceService");

        //只推送信息给流程发起人
        if (null != identityService && null != extActPInstanceService) {
            //根据流程实例id查询流程实例信息
            ExtendActInstanceEntity instanceEntity = extActPInstanceService.queryObject(delegateTask.getProcessInstanceId());
            if (instanceEntity != null) {
                User startedUser = identityService.createUserQuery().userId(instanceEntity.getStartUserId()).singleResult();
                Map<String, Object> conditionMap = Maps.newHashMap();
                conditionMap.put("instanceName", instanceEntity.getName());
                conditionMap.put("startedUser", startedUser.getLastName());
                conditionMap.put("currNodeName", instanceEntity.getCurrNodeName());
                PushVo pushVo = PushUtils.convertPushParam(startedUser, Constant.PushType.FINISH_NOTICE,
                        instanceEntity.getName(), delegateTask, conditionMap);
                //新增推送消息到消息推送信息表中
                new FeignUtil<PushApi>().invokeCommonService(PushApi.class).convertAndSendToUser(pushVo);
            }
        }
    }

    @Override
    protected Integer getScriptType() {
        return 1;
    }
}
